{% extends '__base__.html' %}
{% block title %}使用list和tuple-Jack's web app{% endblock %}

{% block content %}
<h3>使用list和tuple</h3>
<p>Author:Jack</p>
<h3>list</h3>
<p>Python内置的一种数据类型是列表：list。list是一种有序的集合，可以随时添加和删除其中的元素。</p>
<p>比如，列出班里所有同学的名字，就可以用一个list表示：</p>
<pre class="code1">
&gt;&gt;&gt; classmates=['Michael','Bob','Jack']
&gt;&gt;&gt; classmates
['Michael','Bob','Jack']
</pre>
<p>变量classmates就是一个list。用len()函数可以获得list元素的个数：</p>
<pre class="code1">
&gt;&gt;&gt; len(classmates)
3
</pre>
<p>用索引来访问list中每一个位置的元素，记得索引是从0开始的：</p>
<pre class="code1">
&gt;&gt;&gt; classmates[0]
'Michael'
&gt;&gt;&gt; classmates[1]
'Bob'
&gt;&gt;&gt; classmates[2]
'Jack'
&gt;&gt;&gt; classmates[3]
Traceback (most recent call last):
  File "<b style="color:purple">&lt;stdin&gt;</b>", line 1, in <b style="color:purple">&lt;module&gt</b>;
IndexError: list index out of range
</pre>
<p>当索引超出了范围时，Python会报一个IndexError错误，所以，要确保索引不要越界，记得最后一个元素的索引是len(classmates)-1.</p>
<p>如果要取最后一个元素，除了计算索引位置外，还可以用-1做索引，直接获取最后一个元素：</p>
<pre class="code1">
&gt;&gt;&gt; classmates[-1]
'Jack'
</pre>
<p>以此类推，可以获取倒数第2个、倒数第3个：</p>
<pre class="code1">
&gt;&gt;&gt; classmates[-2]
'Bob'
&gt;&gt;&gt; classmates[-3]
'Michael'
&gt;&gt;&gt; classmates[-4]
Traceback (most recent call last):
  File "<b style="color:purple">&lt;stdin&gt;</b>", line 1, in <b style="color:purple">&lt;module&gt</b>;
IndexError: list index out of range
</pre>
<p>当然，倒数第4个就越界了。</p>
<p>list是一个可变的有序表，所以，可以往list中追加元素到末尾：</p>
<pre class="code1">
&gt;&gt;&gt; classmates.append('Adam')
&gt;&gt;&gt; classmates
['Michael','Bob','Jack','Adam']
</pre>
<p>也可以把元素插入到指定的位置，比如索引号为1的位置：</p>
<pre class="code1">
&gt;&gt;&gt; classmates.insert(1,'Cici')
&gt;&gt;&gt; classmates
['Michael','Cici','Bob','Jack','Adam']
</pre>
<p>要删除list末尾的元素，用pop()方法：</p>
<pre class="code1">
&gt;&gt;&gt; classmates.pop()
'Adam'
&gt;&gt;&gt; classmates
['Michael','Cici','Bob','Jack']
</pre>
<p>要删除指定位置的元素，用pop(i)方法，其中i是索引位置：</p>
<pre class="code1">
&gt;&gt;&gt; classmates.pop(2)
'Bob'
&gt;&gt;&gt; classmates
['Michael','Cici','Jack']
</pre>
<p>要把某个元素替换成别的元素，可以直接赋值给对应的索引位置：</p>
<pre class="code1">
&gt;&gt;&gt; classmates[1]='Cathy'
&gt;&gt;&gt; classmates
['Michael','Cathy','Jack']
</pre>
<p>list里面的元素的数据类型也可以不同，比如：</p>
<pre class="code1">
&gt;&gt;&gt; L=['Apple',<code style="color:pink">123</code>,<code style="color:blue">True</code>]
</pre>
<p>list元素也可以是另一个list，比如：</p>
<pre class="code1">
&gt;&gt;&gt; programming_languages=['python','java',['asp','php'],'sql']
&gt;&gt;&gt; len(programming_languages)
4
</pre>
<p>要注意s只有4个元素，其中s[2]又是一个list，如果拆开写就更容易理解了：</p>
<pre class="code1">
&gt;&gt;&gt; script_languages=['asp','php']
&gt;&gt;&gt; programming_languages=['python','java',script_languages,'sql']
</pre>
<p>要拿到'php'可以写script_languages[1]或者programming_languages[2][1]，因此s可以看成是一个二维数组，类似的还有三维,四维......数组，不过很少用到。</p>
<p>如果一个list中一个元素也没有，就是一个空的list，它的长度为0：</p>
<pre class="code1">
&gt;&gt;&gt; L=[]
&gt;&gt;&gt; len(L)
0
</pre>
<h3>tuple</h3>
<p>另一种有序列表叫元组：tuple。tuple和list非常类似，但是tuple一旦初始化就不能修改，比如同样是列出同学的名字：</p>
<pre class="code1">
&gt;&gt;&gt; classmates=('Michael','Bob','Jack')
&gt;&gt;&gt; classmates
('Michael','Bob','Jack')
</pre>
<p>现在，classmates这个tuple不能变了，它也没有append()，insert()这样的方法。
其他获取元素的方法和list是一样的，你可以正常地使用classmates[0]，classmates[-1]，但不能赋值成另外的元素。</p>
<p>不可变的tuple有什么意义？因为tuple不可变，所以代码更安全。如果可能，能用tuple代替list就尽量用tuple。</p>
<p>tuple的陷阱：当你定义一个tuple时，在定义的时候，tuple的元素就必须被确定下来。</p>
<p>如果要定义一个空的tuple，可以写成()：</p>
<pre class="code1">
&gt;&gt;&gt; T=()
&gt;&gt;&gt; T
()
</pre>
<p>但是，要定义一个只有1个元素的tuple，如果你这么定义：</p>
<pre class="code1">
&gt;&gt;&gt; T=(1)
&gt;&gt;&gt; T
1
</pre>
<p>定义的不是tuple，是1这个数！这是因为括号()既可以表示tuple，又可以表示数学公式中的小括号，这就产生了歧义，因此，Python规定，这种情况下，按小括号进行计算，计算结果自然是1。</p>
<p>所以，只有1个元素的tuple定义时必须加一个逗号 "," ，来消除歧义：</p>
<pre class="code1">
&gt;&gt;&gt; T=(1,)
&gt;&gt;&gt; T
(1,)
</pre>
<p>Python在显示只有1个元素的tuple时，也会加一个逗号,，以免你误解成数学计算意义上的括号。</p>
<h3>小结</h3>
<p>list和tuple是Python内置的有序集合，一个可变，一个不可变。根据需要来选择使用它们。</p>
<h3>参考源码</h3>
<a href="https://gitee.com/jack20081117/learn-python3/blob/master/samples/basic/the_list.py">the_list.py</a>
<br>
<a href="https://gitee.com/jack20081117/learn-python3/blob/master/samples/basic/the_tuple.py">the_tuple.py</a>
<br>
<a href="http://localhost:9090/webapp/python/pythonencoding">&lt;&lt;上一页</a>
<a href="http://localhost:9090/webapp/python/pythonhome" style="float:right">下一页&gt;&gt;</a>
{% endblock %}
